package com.java.interview.string;

/**
 * Created by lyc on 2016-03-23.
 */
//1、如何理解String不可变？
public class InterviewString {
     //String 类用final修饰是不可变的,定义一个字符串是放在常量池中的。
     //public final class String implements java.io.Serializable, Comparable<String>, CharSequence

     public static void main(String[] args){

          String s1 = new String("abc"); //两个对象，一个在string pools中 一个在堆中
          String s2 = "abc";             //不创建对象 指向string pools中的"abc"对象
          String s3 = new String("abc"); //一个对象 堆中

          System.out.println(s1 == s2);  //false
          System.out.println(s1 == s3);  //false
          System.out.println(s2 == s3);  //false
          System.out.println("-----------------------------------");


          //intern() 如果string pools中包含内容 则返回string pools中的对象
          System.out.println(s1 == s1.intern());  //false
          System.out.println(s2 == s1.intern());  //true
          System.out.println(s1.intern() == s3.intern());  //true
          System.out.println("-----------------------------------");

          String hello = "hello";
          String hel = "hel";
          String lo = "lo";
          System.out.println(hello == "hel" + "lo"); //true  +号两边都是字符串，会先将字符串合起来，再到string pools中找
          System.out.println(hello == "hel" + lo); //false +号两边有一个是引用，则会在堆中创建对象
          System.out.println(hello == hel + lo);  //false

     }
}
